home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / ZSI / parse.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  11KB  |  322 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from xml.dom import expatbuilder
  5. from ZSI import _copyright, _children, _attrs, _child_elements, _stringtypes, _backtrace, EvaluateException, ParseException, _valid_encoding, _Node, _find_attr, _resolve_prefix
  6. from ZSI.TC import AnyElement
  7. import types
  8. from ZSI.wstools.Namespaces import SOAP, XMLNS
  9. from ZSI.wstools.Utility import SplitQName
  10.  
  11. _find_actor = lambda E: if not E.getAttributeNS(SOAP.ENV, 'actor'):
  12. pass
  13.  
  14. _find_mu = lambda E: E.getAttributeNS(SOAP.ENV, 'mustUnderstand')
  15.  
  16. _find_root = lambda E: E.getAttributeNS(SOAP.ENC, 'root')
  17.  
  18. _find_id = lambda E: _find_attr(E, 'id')
  19.  
  20. class DefaultReader:
  21.     fromString = staticmethod(expatbuilder.parseString)
  22.     fromStream = staticmethod(expatbuilder.parse)
  23.  
  24.  
  25. class ParsedSoap:
  26.     defaultReaderClass = DefaultReader
  27.     
  28.     def __init__(self, input, readerclass = None, keepdom = False, trailers = False, resolver = None, envelope = True, **kw):
  29.         self.readerclass = readerclass
  30.         self.keepdom = keepdom
  31.         if not self.readerclass:
  32.             self.readerclass = self.defaultReaderClass
  33.         
  34.         
  35.         try:
  36.             self.reader = self.readerclass()
  37.             if type(input) in _stringtypes:
  38.                 self.dom = self.reader.fromString(input)
  39.             else:
  40.                 self.dom = self.reader.fromStream(input)
  41.         except Exception:
  42.             e = None
  43.             raise 
  44.  
  45.         self.ns_cache = {
  46.             id(self.dom): {
  47.                 'xml': XMLNS.XML,
  48.                 'xmlns': XMLNS.BASE,
  49.                 '': '' } }
  50.         self.trailers = trailers
  51.         self.resolver = resolver
  52.         self.id_cache = { }
  53.         c = _[1]
  54.         if len(c) != 1:
  55.             raise ParseException('Document has extra child elements', 0)
  56.         
  57.         if envelope is False:
  58.             self.body_root = c[0]
  59.             return None
  60.         
  61.         elt = c[0]
  62.         if elt.localName != 'Envelope' or elt.namespaceURI != SOAP.ENV:
  63.             raise ParseException('Document has "' + elt.localName + '" element, not Envelope', 0)
  64.         
  65.         self._check_for_legal_children('Envelope', elt)
  66.         for a in _attrs(elt):
  67.             name = a.nodeName
  68.             if name.find(':') == -1 and name not in ('xmlns', 'id'):
  69.                 raise ParseException('Unqualified attribute "' + name + '" in Envelope', 0)
  70.                 continue
  71.         
  72.         self.envelope = elt
  73.         if not _valid_encoding(self.envelope):
  74.             raise ParseException('Envelope has invalid encoding', 0)
  75.         
  76.         c = _[2]
  77.         elt = c[0]
  78.         if elt.localName == 'Header' and elt.namespaceURI == SOAP.ENV:
  79.             self._check_for_legal_children('Header', elt)
  80.             self._check_for_pi_nodes(_children(elt), 1)
  81.             self.header = c.pop(0)
  82.             self.header_elements = _child_elements(self.header)
  83.         else:
  84.             self.header = None
  85.             self.header_elements = []
  86.         if len(c) == 0:
  87.             raise ParseException('Envelope has header but no Body', 0)
  88.         
  89.         elt = c.pop(0)
  90.         if elt.localName != 'Body' or elt.namespaceURI != SOAP.ENV:
  91.             if self.header:
  92.                 raise ParseException('Header followed by "' + elt.localName + '" element, not Body', 0, elt, self.dom)
  93.             else:
  94.                 raise ParseException('Document has "' + elt.localName + '" element, not Body', 0, elt, self.dom)
  95.         
  96.         self._check_for_legal_children('Body', elt, 0)
  97.         self._check_for_pi_nodes(_children(elt), 0)
  98.         self.body = elt
  99.         if not _valid_encoding(self.body):
  100.             raise ParseException('Body has invalid encoding', 0)
  101.         
  102.         if not self.trailers:
  103.             if len(c):
  104.                 raise ParseException('Element found after Body', 0, elt, self.dom)
  105.             
  106.         else:
  107.             self.trailer_elements = c
  108.             for elt in self.trailer_elements:
  109.                 if not elt.namespaceURI:
  110.                     raise ParseException('Unqualified trailer element', 0, elt, self.dom)
  111.                     continue
  112.             
  113.         self.body_root = None
  114.         no = []
  115.         maybe = []
  116.         for elt in _child_elements(self.body):
  117.             root = _find_root(elt)
  118.             if root == '1':
  119.                 if self.body_root:
  120.                     raise ParseException('Multiple seralization roots found', 0, elt, self.dom)
  121.                 
  122.                 self.body_root = elt
  123.                 continue
  124.             if root == '0':
  125.                 no.append(elt)
  126.                 continue
  127.             if not root:
  128.                 maybe.append(elt)
  129.                 continue
  130.             raise ParseException('Illegal value for root attribute', 0, elt, self.dom)
  131.         
  132.         if self.body_root is None:
  133.             if len(maybe):
  134.                 self.body_root = maybe[0]
  135.             else:
  136.                 raise ParseException('No serialization root found', 0, self.body, self.dom)
  137.         
  138.         if not _valid_encoding(self.body_root):
  139.             raise ParseException('Invalid encoding', 0, elt, self.dom)
  140.         
  141.         rootid = id(self.body_root)
  142.         self.data_elements = _[3]
  143.         self._check_for_pi_nodes(self.data_elements, 0)
  144.  
  145.     
  146.     def __del__(self):
  147.         
  148.         try:
  149.             if not self.keepdom:
  150.                 self.reader.releaseNode(self.dom)
  151.         except:
  152.             pass
  153.  
  154.  
  155.     
  156.     def _check_for_legal_children(self, name, elt, mustqualify = 1):
  157.         inheader = name == 'Header'
  158.         for n in _children(elt):
  159.             t = n.nodeType
  160.             if t == _Node.COMMENT_NODE:
  161.                 continue
  162.             
  163.             if t != _Node.ELEMENT_NODE:
  164.                 if t == _Node.TEXT_NODE and n.nodeValue.strip() == '':
  165.                     continue
  166.                 
  167.                 raise ParseException('Non-element child in ' + name, inheader, elt, self.dom)
  168.             
  169.             if mustqualify and not (n.namespaceURI):
  170.                 raise ParseException('Unqualified element "' + n.nodeName + '" in ' + name, inheader, elt, self.dom)
  171.                 continue
  172.         
  173.  
  174.     
  175.     def _check_for_pi_nodes(self, list, inheader):
  176.         list = list[:]
  177.         while list:
  178.             elt = list.pop()
  179.             t = elt.nodeType
  180.             if t == _Node.PROCESSING_INSTRUCTION_NODE:
  181.                 raise ParseException('Found processing instruction "<?' + elt.nodeName + '...>"', inheader, elt.parentNode, self.dom)
  182.             elif t == _Node.DOCUMENT_TYPE_NODE:
  183.                 raise ParseException('Found DTD', inheader, elt.parentNode, self.dom)
  184.             
  185.             list += _children(elt)
  186.  
  187.     
  188.     def Backtrace(self, elt):
  189.         return _backtrace(elt, self.dom)
  190.  
  191.     
  192.     def FindLocalHREF(self, href, elt, headers = 1):
  193.         if href[0] != '#':
  194.             raise EvaluateException('Absolute HREF ("%s") not implemented' % href, self.Backtrace(elt))
  195.         
  196.         frag = href[1:]
  197.         e = self.id_cache.get(frag)
  198.         if e:
  199.             return e
  200.         
  201.         list = self.data_elements[:] + [
  202.             self.body_root]
  203.         if headers:
  204.             list.extend(self.header_elements)
  205.         
  206.         while list:
  207.             e = list.pop()
  208.             if e.nodeType == _Node.ELEMENT_NODE:
  209.                 nodeid = _find_id(e)
  210.                 if nodeid:
  211.                     self.id_cache[nodeid] = e
  212.                     if nodeid == frag:
  213.                         return e
  214.                     
  215.                 
  216.             
  217.             list += _children(e)
  218.         raise EvaluateException('Can\'t find node for HREF "%s"' % href, self.Backtrace(elt))
  219.  
  220.     
  221.     def ResolveHREF(self, uri, tc, **keywords):
  222.         r = getattr(tc, 'resolver', self.resolver)
  223.         if not r:
  224.             raise EvaluateException('No resolver for "' + uri + '"')
  225.         
  226.         
  227.         try:
  228.             if type(uri) == types.UnicodeType:
  229.                 uri = str(uri)
  230.             
  231.             retval = r(uri, tc, self, **keywords)
  232.         except Exception:
  233.             e = None
  234.             raise EvaluateException('Can\'t resolve "' + uri + '" (' + str(e.__class__) + '): ' + str(e))
  235.  
  236.         return retval
  237.  
  238.     
  239.     def GetMyHeaderElements(self, actorlist = None):
  240.         if actorlist is None:
  241.             actorlist = [
  242.                 None,
  243.                 SOAP.ACTOR_NEXT]
  244.         else:
  245.             actorlist = list(actorlist) + [
  246.                 None,
  247.                 SOAP.ACTOR_NEXT]
  248.         return _[1]
  249.  
  250.     
  251.     def GetElementNSdict(self, elt):
  252.         d = self.ns_cache.get(id(elt))
  253.         if not d:
  254.             if elt != self.dom:
  255.                 d = self.GetElementNSdict(elt.parentNode)
  256.             
  257.             for a in _attrs(elt):
  258.                 if a.namespaceURI == XMLNS.BASE:
  259.                     if a.localName == 'xmlns':
  260.                         d[''] = a.nodeValue
  261.                     else:
  262.                         d[a.localName] = a.nodeValue
  263.                 a.localName == 'xmlns'
  264.             
  265.             self.ns_cache[id(elt)] = d
  266.         
  267.         return d.copy()
  268.  
  269.     
  270.     def GetDomAndReader(self):
  271.         return (self.dom, self.reader)
  272.  
  273.     
  274.     def IsAFault(self):
  275.         e = self.body_root
  276.         if not e:
  277.             return 0
  278.         
  279.         if e.namespaceURI == SOAP.ENV:
  280.             pass
  281.         return e.localName == 'Fault'
  282.  
  283.     
  284.     def Parse(self, how):
  285.         if type(how) == types.ClassType:
  286.             how = how.typecode
  287.         
  288.         return how.parse(self.body_root, self)
  289.  
  290.     
  291.     def WhatMustIUnderstand(self):
  292.         return _[1]
  293.  
  294.     
  295.     def WhatActorsArePresent(self):
  296.         results = []
  297.         for E in self.header_elements:
  298.             a = _find_actor(E)
  299.             if a not in [
  300.                 None,
  301.                 SOAP.ACTOR_NEXT]:
  302.                 results.append(a)
  303.                 continue
  304.         
  305.         return results
  306.  
  307.     
  308.     def ParseHeaderElements(self, ofwhat):
  309.         d = { }
  310.         lenofwhat = len(ofwhat)
  311.         c = self.header_elements[:]
  312.         crange = range(len(self.header_elements))
  313.         for i in range(lenofwhat):
  314.             pass
  315.         
  316.         return d
  317.  
  318.  
  319. if __name__ == '__main__':
  320.     print _copyright
  321.  
  322.